package reversi;

import java.io.Serializable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Klasa <code>BoardLocation</code> służy upakowaniu w jednym miejscu  danych o lokalizacji.
 * @author Sebastian Gabor
 * @version 0.2
 *
 */
public class BoardLocation implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = -6211451692101631558L;
	/**
	 * Konstruktor klasy pomocniczej BoardLocation
	 * @param aX bezwzględna współrzędna x
	 * @param aY bezwzględna współrzędna y
	 * @param aStatus kolor żetonu/lub puste pole
	 */

	public BoardLocation(int aX, int aY, byte aStatus) {
		// TODO Auto-generated constructor stub
		x=aX;
		y=aY;
		status=aStatus;
		
	}
	/**
	 * Tworzenie klasy bezpośrednio ze Stringa ją opisującego. 
	 * @param str - łańcuch o formacie <litera> <liczba>
	 */
	public BoardLocation(String str) {
		Matcher result;
		Pattern pattern =  Pattern.compile("(\\w+) (\\d+)");
		   try {		       
		           
	            result =pattern.matcher(str);
		        result.find();		           		            	     
				if (result.groupCount()==2){
					x=Integer.valueOf((int)result.group(1).charAt(0))-97;
					y=Integer.parseInt(result.group(2))-1;
					status=ReversiBoard.EMPTY;
				}
			
		            
		        
		    } catch (IllegalStateException e){
		    	System.out.println("IllegalStateException");
		    }

		
	}
	/**
	 * Metoda zwracająca bezwzględną współrzędną x.
	 * @return zwraca bezwzględną współrzędną x
	 */
	public int getX(){
		return x;
	}
	/**
	 * Metoda zwracająca bezwzględną współrzędną y.
	 * @return zwraca bezwzględną współrzędną y
	 */
	public int getY(){
		return y;
	}
	
	
	/**
	 * Funkcja zwracająca stan pola podany w konstruktorze, ogólnie ma to tylko funkcje pomocnicze.
	 * @return zwraca stan pola tej lokalizacji
	 */
	public byte getColor(){
		return status;
		
	}
	
	/**
	 * Porównuje dwa pola jest symetryczne.
	 * @param b pole do porównania
	 * @return wynik porównania
	 */
	public boolean equals(BoardLocation b){
		if (x==b.getX() && y==b.getY() && status==b.getColor())
			return true;
		return false;
		
	}
	/**
	 * Porównuje dwa pola mają taką samą lokalizację
	 * @param b pole do porównania
	 * @return wynik porównania
	 */
	
	public boolean equalsWithoutStatus(BoardLocation b){
		if (x==b.getX() && y==b.getY() )
			return true;
		return false;
		
	}
	
	/**
	 * zmienna przechowująca bezwzględną współrzędną x
	 */
	private int x;
	/**
	 * zmienna przechowująca bezwzględną współrzędną y
	 */
	private int y;
	/**
	 * zmienna przechowująca stan lokacji
	 */
	private byte status;

	

}
